class Transporte < ActiveRecord::Base
    include Auditing

    has_many :armazenamentos
    has_many :depositos, :through => :armazenamentos, :dependent => :destroy

    before_save :data_faturamento, :em_box

    belongs_to :status
    belongs_to :tipo
    belongs_to :transportadora
    belongs_to :destino
    belongs_to :user

    validates_presence_of :ndt, :m, :peso, :pares, :cxs, :transportadora, :user,
            :destino, :tipo, :status, :created_at

    validates_numericality_of :ndt, :m, :peso, :pares, :cxs

    validates_uniqueness_of :ndt

    validates_each :created_at  do |record, attr, value|
        record.errors.add :created_at, "inválida." unless Date.valid?(value)
    end

    #Scopo por Status
    named_scope :s, lambda { |status|
        {:conditions => ["status_id = ?", status] }
    }

    def to_label
        self.id
    end

    def ndt_novo
        "#{self.ndt.to_i}"
    end

    def pares_novo
        "#{self.pares.to_i.para_dinheiro.to_s_m}"
    end

    def cxs_novo
        "#{self.cxs.to_i.para_dinheiro.to_s_m}"
    end

    def m_novo
        "#{self.m.to_i.para_dinheiro.to_s_m}"
    end

    def peso_novo
        "#{self.peso.to_i.para_dinheiro.to_s_m}"
    end

    def data_inicio
        return self.created_at.to_s_br
    end

    def armazenados_em
        nome = ""
        self.armazenamentos.each do |arm|
            deposito = arm.deposito
            nome += "#{deposito.nome}\n\n"# - #{arm.box},"
        end
        return nome
    end
	
    def nome_depositos(transporte)
        nome = ""
        Transporte.find(transporte).armazenamentos.each do |arm|
            deposito = arm.deposito
            nome += "#{deposito.nome}\n\n - #{arm.box} "
        end
        return nome
    end	

    def etq
        self.etiqueta ? "OK" : " - "
    end

    def data_faturamento
        if self.status.id == $LIB
            self.ended_at ||= Deposito.new.current_time
			self.released_at ||= Deposito.new.current_time
		else
			self.released_at = nil
        end
    end	
	
	def em_box
		if Transporte.new.precisa_de_box?(self.status.id)
			self.entrou_em_box ||= Deposito.new.current_time 
		else
			self.entrou_em_box = nil
		end
	end	
	
	def tempo_em_box
		if !self.released_at.nil? && !self.entrou_em_box.nil?
			result = distance_of_time_in_words(self.entrou_em_box, self.released_at)
		else	
			result = ""
		end
	end	
	
  def distance_of_time_in_words(from_time, to_time = 0, include_seconds = false)
		from_time = from_time.to_time if from_time.respond_to?(:to_time)
		to_time = to_time.to_time if to_time.respond_to?(:to_time)
		distance_in_minutes = (((to_time - from_time).abs)/60).round
		distance_in_seconds = ((to_time - from_time).abs).round
		distance_in_hours = ((distance_in_minutes.to_f / 60).abs).round
		
		horas = (((to_time - from_time)) / 3600).round
		minutos = (((distance_in_seconds % 3600) / 60).abs).round
		@horas = horas
		@minutos = minutos
		#return Time.zone.local(Time.zone.now.year,Time.zone.now.month,Time.zone.now.day, horas,minutos).strftime("%H:%M")
		"#{horas}h #{minutos}min"
	end	
		
	def self.faturadosdia		
		inicio,fim = Deposito.new.current_time.utc.beginning_of_month, Deposito.new.current_time.utc.end_of_month
		
		@faturados_dia = []
		fim.day.times do |t|
		
			faturados_dia = []
			total, valor  = 0, 0
			
			@depositos = Deposito.find(:all)
			@depositos.each do |d|
				faturados_dia  << "#{d.nome.downcase}".to_sym
				valor = Deposito.new.soma_d_d1_d2_f(d.id,inicio,inicio)
				faturados_dia << valor
				total += valor
			end
			faturados_dia << "total".to_sym
			faturados_dia << total
			faturados_dia << "data".to_sym
			faturados_dia << inicio
			faturados = Hash[*faturados_dia]
			
			@faturados_dia << faturados.symbolize_keys	
			
			#Inicio passar ser amanhã
			inicio = inicio.tomorrow
			
		end
		
		@faturados_dia
	end	
	
	def self.faturadosmes
		inicio,fim = Deposito.new.current_time.utc.beginning_of_month, Deposito.new.current_time.utc.end_of_month
		
		faturadosmes = []
		total, valor  = 0, 0
		
		@depositos = Deposito.find(:all)
		@depositos.each do |d|
			faturadosmes  << "#{d.nome.downcase}".to_sym
			valor = Deposito.new.soma_d_d1_d2_f(d.id,inicio,fim)
			faturadosmes << valor
			total += valor
		end
		faturadosmes << "total".to_sym
		faturadosmes << total
		@faturadosmes = Hash[*faturadosmes]
		@faturadosmes.symbolize_keys		
	end	

    def isfaturamento?(id)
         $STATUS_FATURADOS.include?(id)
    end

    def precisa_de_box?(id)
        $STATUS_PRECISA_DE_BOX.include?(id)
    end	
end
